package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.beans.adapter.DataAdapter;
import com.divemotor.ventarepuestosinternet.beans.form.GrupoBeanForm;
import com.divemotor.ventarepuestosinternet.dao.GrupoDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Grupo;
import com.divemotor.ventarepuestosinternet.model.Imagen;
import com.divemotor.ventarepuestosinternet.model.VehiculoExtra;
import com.divemotor.ventarepuestosinternet.util.Constantes;


@SuppressWarnings("unchecked")
@Repository(value="grupoDAO")
public class GrupoDAOImpl extends GenericoDAOImpl<Grupo, Integer> implements GrupoDAO, Serializable {

	private static final long serialVersionUID = -7673296888562440185L;

	public GrupoDAOImpl() {
		setClase(Grupo.class);
	}

	@Override
	public List<Grupo> buscarGrupos(GrupoBeanForm grupoBeanForm) {
			
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Grupo.class);
		
		String codigo = grupoBeanForm.getCodigo();
		if(StringUtils.isNotBlank(codigo)){
			criteria.add(Restrictions.like("codigo",Constantes.PORCENTAJE + codigo + Constantes.PORCENTAJE).ignoreCase());
		}
		
		String descripcion = grupoBeanForm.getDescripcion();
		if(StringUtils.isNotBlank(descripcion)){
			criteria.add(Restrictions.like("nombre",Constantes.PORCENTAJE + descripcion + Constantes.PORCENTAJE).ignoreCase());
		}
		
		String estado = grupoBeanForm.getEstado();
		if(StringUtils.isNotBlank(estado)  && !estado.equals(Constantes.GUION)){
			criteria.add(Restrictions.eq("estado", estado));
		} else {
			criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		}
		
		return criteria.list();
	}

	@Override
	public List<DataAdapter> listarGruposPorVehiculo(String chasis, String tipoComponente) {
		return sessionFactory.getCurrentSession().getNamedQuery("Grupos.comboGruposVehiculos")
							 .setParameter("chasis", chasis)
							 .setParameter("tipoComponente", tipoComponente).list();
	}

	@Override
	public List<Grupo> listarGruposPorVehiculoExtra(VehiculoExtra vehiculoExtra) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Imagen.class, "imagen")
				.createAlias("imagen.modeloFabrica", "modeloFabrica")
				.createAlias("modeloFabrica.listaModelo", "modelo")
				.createAlias("modelo.listaVehiculoExtra", "vehiculoExtra")
				.createAlias("imagen.subGrupo", "subGrupo")
				.createAlias("subGrupo.grupo", "grupo")
				.setProjection(Projections.projectionList().add(Projections.distinct(Projections.property("subGrupo.grupo.idGrupo"))))
				.add(Restrictions.eq("vehiculoExtra.idVehiculoExtra", vehiculoExtra.getIdVehiculoExtra()));
		return listarGruposPorIds(criteria.list());
	}

	@Override
	public List<Grupo> listarGruposPorIds(List<Integer> listaIdsGrupos) {
		if (listaIdsGrupos != null && listaIdsGrupos.size() > 0) {
			Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Grupo.class, "grupo")
																  .add(Restrictions.in("grupo.idGrupo", listaIdsGrupos))
																  .addOrder(Order.asc("grupo.nombre"));
			return criteria.list();
		} else {
			return null;
		}
	}

	@Override
	public List<Grupo> listarPorNombre() {
		Criteria  criteria = sessionFactory.getCurrentSession().createCriteria(Grupo.class, "grupo")				
															   .add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)))
															   .addOrder(Order.asc("grupo.nombre"));
		return  criteria.list();
	}

	@Override
	public List<Grupo> obtenerComboGrupos() throws DivemotorBusinessException {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Grupo.class);
		criteria.setProjection(Projections.projectionList().add(Projections.property("idGrupo"),"idGrupo")
														    .add(Projections.property("nombre"),"nombre")
														    .add(Projections.property("codigo"),"codigo"));
		criteria.add(Restrictions.eq("estado", Constantes.ESTADO_ACTIVO));
		criteria.setResultTransformer(Transformers.aliasToBean(Grupo.class));
		return criteria.list();
	}

	@Override
	public List<DataAdapter> obtenerListaGruposActivos() {
		return sessionFactory.getCurrentSession().getNamedQuery("Grupos.listaGrupos").
												  setParameter("estado", Constantes.ESTADO_ACTIVO).
												  list();
	}
	
}